home *** CD-ROM | disk | FTP | other *** search
- /* 4567890123456789012345678901234567890123456789012345678901234567 */
- /*
- * File: Toolbox.c
- * Author: Mark H. Linton
- * Creation Date: 2/4/95
- * Modification Date:
- * Description: A collection of routines which may be used to
- * handle tasks that every application performs
- * in exactly the same way.
- */
- #include <Dialogs.h>
- #include <Fonts.h>
- #include <DiskInit.h>
- #include <ToolUtils.h>
- #include <Resources.h>
- #include <Memory.h>
- #include <LowMem.h>
- #include <Gestalt.h>
-
- #include "Toolbox.h"
- #include "ResourceDefinitions.h"
-
- #define kReserveMemorySize (48L * 1024L)
- #define kMinStackSpace (32L * 1024L)
- /*
- * With a heap of 136K and a 48K reserve, DocumentarySynchronicity
- * triggers its GrowZoneProc when 29 empty windows are open. At this
- * point the MacsBug 'HT' command indicates that there are 876
- * relocatable (Handle based) objects in the heap. We allow about 25%
- * more than required in kTotalMasterPointers. This is divided by 64
- * in InitToolbox to determine the number of master pointer blocks
- * required by the application.
- */
- #define kTotalMasterPointers ((876 * 5) / 4)
-
- pascal long ShellGrowZone(Size aBytesNeeded);
-
- struct Toolbox {
- Handle reserveMemory;
- Boolean notified;
- } t; /* do not clutter global name space, Re: qd.thePort */
-
- OSErr InitToolbox(void) {
- OSErr theError = noErr;
- long theDefaultStack = LMGetDefltStack();
- short i;
- Ptr theApplLimit = GetApplLimit();
-
- t.notified = false;
- t.reserveMemory = nil;
- if (theDefaultStack < kMinStackSpace) {
- SetApplLimit(theApplLimit - (kMinStackSpace - theDefaultStack));
- theError = MemError(); /* memFullErr (-108) - no stack space */
- } else {
- theError = noErr;
- }
- if (theError == noErr) {
- MaxApplZone();
- for (i=0; (i<(kTotalMasterPointers/64)) && (theError == noErr); i++) {
- MoreMasters();
- theError = MemError(); /* memFullErr (-108) means no space
- for master pointer blocks */
- }
- }
- if (theError == noErr) {
- t.reserveMemory = NewHandleClear(kReserveMemorySize);
- if (t.reserveMemory == nil) {
- theError = memFullErr; /* did not have space for reserve
- memory */
- } else {
- MoveHHi(t.reserveMemory);
- HLock(t.reserveMemory);
- SetGrowZone(ShellGrowZone);
- }
- }
-
- /* Need these to work even if just to display our error dialog */
- InitGraf((Ptr)&qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- FlushEvents(everyEvent,0);
- TEInit();
- InitDialogs(0L);
-
- return theError;
- }
-
- pascal long ShellGrowZone(Size aBytesNeeded) {
- long theA5;
- long theBytesFreed = 0;
-
- theA5 = SetCurrentA5();
- if ((t.reserveMemory != nil) && (*(t.reserveMemory) != nil) &&
- (t.reserveMemory != GZSaveHnd())) {
- HUnlock(t.reserveMemory);
- EmptyHandle(t.reserveMemory);
- theBytesFreed = kReserveMemorySize;
- }
- theA5 = SetA5(theA5);
- return theBytesFreed;
- }
-
- void CheckGrowZone(void) {
- if ((t.reserveMemory != nil) && (*(t.reserveMemory) == nil)) {
- /*
- * Reserve was released, try to get it back.
- */
- ReallocateHandle(t.reserveMemory, kReserveMemorySize);
- if (MemError() == memFullErr) {
- if (!t.notified) {
- (void)StopAlert(rLowMemoryAlert, nil);
- t.notified = true;
- }
- } else {
- MoveHHi(t.reserveMemory);
- HLock(t.reserveMemory);
- t.notified = false;
- }
- }
- }
-
- void DoDiskEvent(long aMessage) {
- Point thePoint = {120, 120};
-
- if (HiWord(aMessage) != noErr) {
- DILoad();
- (void)DIBadMount(thePoint, aMessage);
- DIUnload();
- }
- }
-
- Boolean CommandKeyIsDown(void) {
- KeyMap keymap;
-
- GetKeys(keymap);
- return ((keymap[1] >> 15) & 1);
- }
-
- Boolean OptionKeyIsDown(void) {
- KeyMap keymap;
-
- GetKeys(keymap);
- return ((keymap[1] >> 2) & 1);
- }
-
- #ifndef kPMProcessMenuID
- #define kPMProcessMenuID (-16489L)
- #endif
-
- void HideApplication(void) {
- SystemMenu((kPMProcessMenuID << 16) + 1);
- }
-
- void ReportError(OSErr anError) {
- StringHandle theString = nil;
- Str15 theNumber;
- short theID;
- ResType theType;
- Str255 theName;
-
- NumToString(anError, theNumber);
- theString = (StringHandle)GetResource('Estr', (short)anError);
- if (theString != nil) {
- HLock((Handle)theString);
- GetResInfo((Handle)theString, &theID, &theType, theName);
- ParamText(theNumber, theName, *theString, kNullString);
- } else {
- ParamText(theNumber, "\p???", kNullString, kNullString);
- }
- (void)StopAlert(rErrorAlert, nil);
- if (theString != nil) {
- HUnlock((Handle)theString);
- ReleaseResource((Handle)theString);
- }
- }
-
- Boolean HasFeature(OSType anAttribute, long aFeature) {
- long theResponse;
- Boolean hasFeature =
- (Gestalt(anAttribute, &theResponse) == noErr) &&
- ((theResponse & (1L << aFeature)) != 0);
- return hasFeature;
- }
-